Introduction

Lorem ipsum

Libraries

library(tidyverse)
library(httr)
library(readxl)
library(plotly)

Preprocessing

Import

# embed code from https://data.world/makeovermonday/2021w5
GET("https://query.data.world/s/rnsywm4k4ae3vz2iitu6cg4sww6xbc", 
    write_disk(tf <- tempfile(fileext = ".xlsx")))
raw <- read_excel(tf)

Refactor columns

data <- raw %>%
  select(Year = Year, Country = Area, Source = Variable, 
         Production = `Generation (TWh)`) %>%
  mutate(across(c(Country, Source), factor))

data$Year <- as.integer(data$Year)
data

Handle Sources

View all Sources

data %>%
  group_by(Source) %>%
  summarise(Total.TWh = sum(Production))

Define Source types

sources <- list(
  fossil = c("Hard Coal", "Lignite", "Gas", "Other fossil"),
  renewable = c("Hydro", "Wind", "Solar", "Bioenergy", "Other renewables"),
  nuclear = c("Nuclear"),
  demand = c("Demand")
)
sources$base <- c(sources$renewable, sources$fossil, sources$nuclear)

Define Source colors

sources$palette <- c("Hard Coal" = "gray10",
                     "Lignite" = "saddlebrown",
                     "Gas" = "darkgoldenrod",
                     "Other fossil" = "darkgray",
                     "Hydro" = "royalblue",
                     "Wind" = "deepskyblue",
                     "Solar" = "gold",
                     "Bioenergy" = "forestgreen",
                     "Other renewables" = "springgreen3",
                     "Nuclear" = "orchid4")

sources$broad.palette <- c("Fossil" = "saddlebrown",
                           "Nuclear" = "orchid4",
                           "Renewables" = "forestgreen")

Add Broad Source

data <- data %>%
  mutate(Broad.Source = factor(case_when(
    Source %in% sources$fossil ~ "Fossil",
    Source %in% sources$nuclear ~ "Nuclear",
    Source %in% sources$renewable ~ "Renewables"
    )))

Filter irrelevant Sources

data <- data %>%
  filter(Source %in% c(sources$base, "Demand"))

Handle Countries

View all Countries

data %>%
  filter(Source == "Demand") %>%
  group_by(Country) %>%
  summarise(Total.Production = sum(Production))

Filter irrelevant Countries

data <- data %>%
  filter(!Country == "EU-27")

Plots

Prepare theme

theme_update(text = element_text(size = 20, color = "gray81"),
             rect = element_rect(fill = "gray14"),
             axis.text = element_text(color = "gray48"),
             panel.background = element_rect(fill = "gray10"),
             panel.grid = element_line(color = "gray15"),
             legend.key = element_rect(fill = "gray14")
             )
theme_set(theme_gray())

Good news

p <- data %>%
  filter(!is.na(Broad.Source)) %>%
  group_by(Year, Broad.Source) %>%
  summarise(Total.Production = sum(Production), .groups = "drop_last") %>%
  ggplot(aes(x = Year, y = Total.Production, color = Broad.Source)) +
  geom_line(size = 2) +
  scale_color_manual(values = sources$broad.palette) +
  theme(legend.position = "bottom") +
  labs(title = "Energy generation sources",
       subtitle = "EU27+1 countries") +
  ylab("Total Generation (TWh)")

p

Static
p

Interactive
ggplotly(p)
LS0tCnRpdGxlOiAiRGF0YSBWaXN1YWxpc2F0aW9uIC0gRXVyb3BlIEVuZXJneSBQcm9kdWN0aW9uIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBkYXJrbHkKICAgIGhpZ2hsaWdodDogYnJlZXplZGFyawotLS0KIyB7LnRhYnNldH0KCiMjIEludHJvZHVjdGlvbiAKCkxvcmVtIGlwc3VtCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQojIGtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgb3V0LmhlaWdodD03LCBvdXQud2lkdGg9MTApCmBgYAoKCiMjIyBMaWJyYXJpZXMKCmBgYHtyIGxpYnJhcmllcywgcmVzdWx0cz0naGlkZSd9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGh0dHIpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHBsb3RseSkKYGBgCgojIyBQcmVwcm9jZXNzaW5nIHsudGFic2V0fQoKIyMjIEltcG9ydAoKYGBge3IgaW1wb3J0LCByZXN1bHRzPSdoaWRlJ30KIyBlbWJlZCBjb2RlIGZyb20gaHR0cHM6Ly9kYXRhLndvcmxkL21ha2VvdmVybW9uZGF5LzIwMjF3NQpHRVQoImh0dHBzOi8vcXVlcnkuZGF0YS53b3JsZC9zL3Juc3l3bTRrNGFlM3Z6MmlpdHU2Y2c0c3d3NnhiYyIsIAogICAgd3JpdGVfZGlzayh0ZiA8LSB0ZW1wZmlsZShmaWxlZXh0ID0gIi54bHN4IikpKQpyYXcgPC0gcmVhZF9leGNlbCh0ZikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfSAKcmF3CmBgYAoKIyMjIFJlZmFjdG9yIGNvbHVtbnMKCmBgYHtyfQpkYXRhIDwtIHJhdyAlPiUKICBzZWxlY3QoWWVhciA9IFllYXIsIENvdW50cnkgPSBBcmVhLCBTb3VyY2UgPSBWYXJpYWJsZSwgCiAgICAgICAgIFByb2R1Y3Rpb24gPSBgR2VuZXJhdGlvbiAoVFdoKWApICU+JQogIG11dGF0ZShhY3Jvc3MoYyhDb3VudHJ5LCBTb3VyY2UpLCBmYWN0b3IpKQoKZGF0YSRZZWFyIDwtIGFzLmludGVnZXIoZGF0YSRZZWFyKQpgYGAKCgpgYGB7cn0KZGF0YQpgYGAKCgojIyMgSGFuZGxlIFNvdXJjZXMgey50YWJzZXR9CgojIyMjIFZpZXcgYWxsIFNvdXJjZXMKYGBge3J9CmRhdGEgJT4lCiAgZ3JvdXBfYnkoU291cmNlKSAlPiUKICBzdW1tYXJpc2UoVG90YWwuVFdoID0gc3VtKFByb2R1Y3Rpb24pKQpgYGAKCiMjIyMgRGVmaW5lIFNvdXJjZSB0eXBlcwoKYGBge3J9CnNvdXJjZXMgPC0gbGlzdCgKICBmb3NzaWwgPSBjKCJIYXJkIENvYWwiLCAiTGlnbml0ZSIsICJHYXMiLCAiT3RoZXIgZm9zc2lsIiksCiAgcmVuZXdhYmxlID0gYygiSHlkcm8iLCAiV2luZCIsICJTb2xhciIsICJCaW9lbmVyZ3kiLCAiT3RoZXIgcmVuZXdhYmxlcyIpLAogIG51Y2xlYXIgPSBjKCJOdWNsZWFyIiksCiAgZGVtYW5kID0gYygiRGVtYW5kIikKKQpzb3VyY2VzJGJhc2UgPC0gYyhzb3VyY2VzJHJlbmV3YWJsZSwgc291cmNlcyRmb3NzaWwsIHNvdXJjZXMkbnVjbGVhcikKYGBgCgoKIyMjIyBEZWZpbmUgU291cmNlIGNvbG9ycwoKYGBge3J9CnNvdXJjZXMkcGFsZXR0ZSA8LSBjKCJIYXJkIENvYWwiID0gImdyYXkxMCIsCiAgICAgICAgICAgICAgICAgICAgICJMaWduaXRlIiA9ICJzYWRkbGVicm93biIsCiAgICAgICAgICAgICAgICAgICAgICJHYXMiID0gImRhcmtnb2xkZW5yb2QiLAogICAgICAgICAgICAgICAgICAgICAiT3RoZXIgZm9zc2lsIiA9ICJkYXJrZ3JheSIsCiAgICAgICAgICAgICAgICAgICAgICJIeWRybyIgPSAicm95YWxibHVlIiwKICAgICAgICAgICAgICAgICAgICAgIldpbmQiID0gImRlZXBza3libHVlIiwKICAgICAgICAgICAgICAgICAgICAgIlNvbGFyIiA9ICJnb2xkIiwKICAgICAgICAgICAgICAgICAgICAgIkJpb2VuZXJneSIgPSAiZm9yZXN0Z3JlZW4iLAogICAgICAgICAgICAgICAgICAgICAiT3RoZXIgcmVuZXdhYmxlcyIgPSAic3ByaW5nZ3JlZW4zIiwKICAgICAgICAgICAgICAgICAgICAgIk51Y2xlYXIiID0gIm9yY2hpZDQiKQoKc291cmNlcyRicm9hZC5wYWxldHRlIDwtIGMoIkZvc3NpbCIgPSAic2FkZGxlYnJvd24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVjbGVhciIgPSAib3JjaGlkNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZW5ld2FibGVzIiA9ICJmb3Jlc3RncmVlbiIpCmBgYAoKCiMjIyMgQWRkIEJyb2FkIFNvdXJjZQoKYGBge3J9CmRhdGEgPC0gZGF0YSAlPiUKICBtdXRhdGUoQnJvYWQuU291cmNlID0gZmFjdG9yKGNhc2Vfd2hlbigKICAgIFNvdXJjZSAlaW4lIHNvdXJjZXMkZm9zc2lsIH4gIkZvc3NpbCIsCiAgICBTb3VyY2UgJWluJSBzb3VyY2VzJG51Y2xlYXIgfiAiTnVjbGVhciIsCiAgICBTb3VyY2UgJWluJSBzb3VyY2VzJHJlbmV3YWJsZSB+ICJSZW5ld2FibGVzIgogICAgKSkpCmBgYAoKYGBge3IgZWNobz1GQUxTRX0KZGF0YQpgYGAKCgoKCiMjIyMgRmlsdGVyIGlycmVsZXZhbnQgU291cmNlcwoKYGBge3J9CmRhdGEgPC0gZGF0YSAlPiUKICBmaWx0ZXIoU291cmNlICVpbiUgYyhzb3VyY2VzJGJhc2UsICJEZW1hbmQiKSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfQpkYXRhCmBgYAoKCgojIyMgSGFuZGxlIENvdW50cmllcyB7LnRhYnNldH0KIyMjIyBWaWV3IGFsbCBDb3VudHJpZXMKYGBge3J9CmRhdGEgJT4lCiAgZmlsdGVyKFNvdXJjZSA9PSAiRGVtYW5kIikgJT4lCiAgZ3JvdXBfYnkoQ291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKFRvdGFsLlByb2R1Y3Rpb24gPSBzdW0oUHJvZHVjdGlvbikpCmBgYAojIyMjIEZpbHRlciBpcnJlbGV2YW50IENvdW50cmllcwoKYGBge3J9CmRhdGEgPC0gZGF0YSAlPiUKICBmaWx0ZXIoIUNvdW50cnkgPT0gIkVVLTI3IikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfQpkYXRhCmBgYAoKCiMjIFBsb3RzIHsudGFic2V0fQoKIyMjIFByZXBhcmUgdGhlbWUKCmBgYHtyfQp0aGVtZV91cGRhdGUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGNvbG9yID0gImdyYXk4MSIpLAogICAgICAgICAgICAgcmVjdCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkxNCIpLAogICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImdyYXk0OCIpLAogICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkxMCIpLAogICAgICAgICAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5MTUiKSwKICAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5MTQiKQogICAgICAgICAgICAgKQpgYGAKCmBgYHtyfQp0aGVtZV9zZXQodGhlbWVfZ3JheSgpKQpgYGAKCiMjIyBHb29kIG5ld3MKCmBgYHtyLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMCwgb3V0LmhlaWdodD03LCBvdXQud2lkdGg9MTB9CnAgPC0gZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKEJyb2FkLlNvdXJjZSkpICU+JQogIGdyb3VwX2J5KFllYXIsIEJyb2FkLlNvdXJjZSkgJT4lCiAgc3VtbWFyaXNlKFRvdGFsLlByb2R1Y3Rpb24gPSBzdW0oUHJvZHVjdGlvbiksIC5ncm91cHMgPSAiZHJvcF9sYXN0IikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gWWVhciwgeSA9IFRvdGFsLlByb2R1Y3Rpb24sIGNvbG9yID0gQnJvYWQuU291cmNlKSkgKwogIGdlb21fbGluZShzaXplID0gMikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBzb3VyY2VzJGJyb2FkLnBhbGV0dGUpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGxhYnModGl0bGUgPSAiRW5lcmd5IGdlbmVyYXRpb24gc291cmNlcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJFVTI3KzEgY291bnRyaWVzIikgKwogIHlsYWIoIlRvdGFsIEdlbmVyYXRpb24gKFRXaCkiKQoKcApgYGAKCiMjIyMgey50YWJzZXR9CgojIyMjIyBTdGF0aWMKYGBge3IsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwLCBvdXQuaGVpZ2h0PTcsIG91dC53aWR0aD0xMH0KcApgYGAKCiMjIyMjIEludGVyYWN0aXZlCgpgYGB7ciwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9MTAsIG91dC5oZWlnaHQ9Nywgb3V0LndpZHRoPTEwfQpnZ3Bsb3RseShwKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK